www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouS\PeerRegeditCtrl.cpp

    //Download by http://www.NewXing.com
// PeerRegeditCtrl.cpp: implementation of the PeerRegeditCtrl.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PeerRegeditCtrl.h"
#include "command.h"
#include "peersocket.h"
#include "peerthread.h"

////////把字符串主键转换成主键句柄/////////////
HKEY GetPeerRegKey(char* keystr)
{
	HKEY hKey;
	if(strcmp(keystr,"HKEY_CLASSES_ROOT")==0)
		hKey=HKEY_CLASSES_ROOT;
	if(strcmp(keystr,"HKEY_CURRENT_CONFIG")==0)
		hKey=HKEY_CURRENT_CONFIG;
	if(strcmp(keystr,"HKEY_CURRENT_USER")==0)
		hKey=HKEY_CURRENT_USER;
	if(strcmp(keystr,"HKEY_LOCAL_MACHINE")==0)
		hKey=HKEY_LOCAL_MACHINE;
	if(strcmp(keystr,"HKEY_USERS")==0)
		hKey=HKEY_USERS;
	return hKey;
	
}

/////枚举键值//////
bool PeerRegeditEnumValue(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	DWORD namelen;	
	DWORD datalen;
	DWORD index;
	HKEY hRootKey,hKey;
	REGEDIT regValue;
	//////////取得枚举注册表所需的信息,主键,子键///////////
	if(!PeerRecvDataS(s,(char*)&regValue,sizeof(regValue),&retLen,
					  hEvent,SENDRECV_TIMEOUT))
	{
		return false;
	}
	//////////转换主键名到主键句柄/////////////
	if(!(hRootKey=GetPeerRegKey(regValue.key)))
	{
		return false;
	}
	//////////打开相应子键,取得句柄//////////////
	if(RegOpenKey(hRootKey,regValue.sunkey,&hKey)!=ERROR_SUCCESS)
	{
		return false;
	}

	namelen=256;datalen=512;

	/////检索键的缺省项值,并做相应处理/////////////////
	memset((char*)&regValue,0,sizeof(regValue));

	if(RegQueryValueEx(hKey,"",NULL,&regValue.type,regValue.data,&datalen)
						!=ERROR_SUCCESS)
	{
		strcpy((char*)regValue.data,"(数据未设项)");
		regValue.datalen=strlen("(数据未设项)")+1;;
		regValue.type=REG_SZ;
	}
	else
	{
		regValue.datalen=datalen;
	}
	strcpy(regValue.value,"(默认)");

	/////////发送值////////////////////
	PeerSendDataS(s,(char*)&regValue,sizeof(regValue),&retLen,hEvent,
				  SENDRECV_TIMEOUT);

	//////////////枚举键的项值并发送///////////////
	namelen=256;datalen=512;index=0;
	memset((char*)&regValue,0,sizeof(regValue));

	while(RegEnumValue(hKey,index,regValue.value,&namelen,NULL,
		  &regValue.type,regValue.data,&datalen)!=ERROR_NO_MORE_ITEMS)
	{
		regValue.datalen=datalen;
		if(strlen(regValue.value)!=0)
		{
			PeerSendDataS(s,(char*)&regValue,sizeof(regValue),&retLen,
						  hEvent,SENDRECV_TIMEOUT);
			if(GetLastError()==PEER_FUNERROR)
				break;
		}
		memset((char*)&regValue,0,sizeof(regValue));
		namelen=256;datalen=512;
		index++;
	}
	RegCloseKey(hKey);

	return true;
}

/////枚举子键//////
bool PeerRegeditEnumKey(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	DWORD namelen;	
	DWORD index;
	HKEY hRootKey,hKey;
	REGEDIT regKey;
	//////////取得枚举注册表所需的信息,主键,子键///////////
	if(!PeerRecvDataS(s,(char*)&regKey,sizeof(regKey),&retLen,
					  hEvent,SENDRECV_TIMEOUT))
	{
		return false;
	}

	//////////转换主键名到主键句柄/////////////
	if(!(hRootKey=GetPeerRegKey(regKey.key)))
	{
		return false;
	}
	//////////打开相应子键,取得句柄//////////////
	if(RegOpenKey(hRootKey,regKey.sunkey,&hKey)!=ERROR_SUCCESS)
	{
		return false;
	}

	namelen=256;index=0;

	memset(&regKey,0,sizeof(regKey));
	HKEY childkey;
	char childkeyvalue[256];
	DWORD childkeylen;childkeylen=256;

	while(RegEnumKey(hKey,index,regKey.sunkey,namelen)!=ERROR_NO_MORE_ITEMS)
	{
		//////////检查键key是否还有子键,有则在regKey.havechild中标志//
		if(RegOpenKey(hKey,regKey.sunkey,&childkey)==ERROR_SUCCESS)
		{
			
			if(RegEnumKey(childkey,0,childkeyvalue,childkeylen)
							==ERROR_SUCCESS)
				regKey.havechild=1;
			else
				regKey.havechild=0;
		}
		else
		{
			regKey.havechild=0;
			RegCloseKey(childkey);
		}
		//////////发送枚举到的子键/////////////////////
		PeerSendDataS(s,(char*)&regKey,sizeof(regKey),&retLen,hEvent,
						SENDRECV_TIMEOUT);
		if(GetLastError()==PEER_FUNERROR)
			break;
		index++;
	}
	RegCloseKey(hKey);

	return true;
}

////////创建子键///////////////
bool PeerRegeditCreateKey(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	REGEDIT regKey;
	HKEY hRootKey,hMakeKey;

	///////////得到要创建的键名////////////////
	if(!PeerRecvDataS(s,(char*)&regKey,sizeof(regKey),&retLen,
					 hEvent,SENDRECV_TIMEOUT))
	{
		return false;
	}

	//////////转换主键名到主键句柄/////////////
	if(!(hRootKey=GetPeerRegKey(regKey.key)))
	{
		return false;
	}

	
	if(RegCreateKey(hRootKey,regKey.sunkey,&hMakeKey)!=ERROR_SUCCESS)
		return false;
		
	/////////发回确认信息/////////////////
	COMMAND cmd;
	memset(&cmd,0,sizeof(cmd));
	cmd.CommandID=PEER_OK;

	if(!PeerSendDataS(s,(char*)&cmd,sizeof(cmd),&retLen,hEvent,
					 SENDRECV_TIMEOUT))
	{
		return false;
	}
	RegCloseKey(hMakeKey);

	return true;
}

////////删除子键///////////////
bool PeerRegeditDeleteKey(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	REGEDIT regKey;
	HKEY hRootKey;

	///////////得到要创建的键名////////////////
	if(!PeerRecvDataS(s,(char*)&regKey,sizeof(regKey),&retLen,
					 hEvent,SENDRECV_TIMEOUT))
	{
		return false;
	}

	//////////转换主键名到主键句柄/////////////
	if(!(hRootKey=GetPeerRegKey(regKey.key)))
	{
		return false;
	}

	//////////删除指定键////////////////////////
	if(RegDeleteKey(hRootKey,regKey.sunkey)!=ERROR_SUCCESS)
		return false;

	/////////发回确认信息/////////////////
	COMMAND cmd;
	memset(&cmd,0,sizeof(cmd));
	cmd.CommandID=PEER_OK;
	if(!PeerSendDataS(s,(char*)&cmd,sizeof(cmd),&retLen,hEvent,
					 SENDRECV_TIMEOUT))
	{
		return false;
	}

	return true;
}

////////得到键的某项值/////////
bool PeerRegeditGetValue(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	REGEDIT regKey;
	HKEY hRootKey,hGetKey;

	///////////得到要创建的键名////////////////
	if(!PeerRecvDataS(s,(char*)&regKey,sizeof(regKey),&retLen,
					 hEvent,SENDRECV_TIMEOUT))
	{
		return false;
	}

	//////////转换主键名到主键句柄/////////////
	if(!(hRootKey=GetPeerRegKey(regKey.key)))
	{
		return false;
	}

	COMMAND cmd;
	memset(&cmd,0,sizeof(cmd));
	if(RegOpenKey(hRootKey,regKey.sunkey,&hGetKey)!=ERROR_SUCCESS)
		return false;
	else
	{
		DWORD datalen=512;
		if(RegQueryValueEx(hGetKey,regKey.value,NULL,&regKey.type,
			regKey.data,&datalen)!=ERROR_SUCCESS)
			return false;
		regKey.datalen=datalen;
	}
	/////////发回得到的键的项的值/////////////////
	if(!PeerSendDataS(s,(char*)&regKey,sizeof(regKey),&retLen,hEvent,
					 SENDRECV_TIMEOUT))
	{
		return false;
	}
	RegCloseKey(hGetKey);

	return true;
}

////////创建/设置键的某项值////
bool PeerRegeditSetValue(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	REGEDIT regKey;
	HKEY hRootKey,hSetKey;

	///////////得到要创建的键名////////////////
	if(!PeerRecvDataS(s,(char*)&regKey,sizeof(regKey),&retLen,
					 hEvent,SENDRECV_TIMEOUT))
	{
		return false;
	}

	//////////转换主键名到主键句柄/////////////
	if(!(hRootKey=GetPeerRegKey(regKey.key)))
	{
		return false;
	}

	
	if(RegOpenKey(hRootKey,regKey.sunkey,&hSetKey)!=ERROR_SUCCESS)
		return false;
	else
	{
		DWORD datalen=512;
		if(RegSetValueEx(hSetKey,regKey.value,NULL,regKey.type,
			regKey.data,regKey.datalen)!=ERROR_SUCCESS)
			return false;
	}
	/////////发回确认信息/////////////////
	COMMAND cmd;
	memset(&cmd,0,sizeof(cmd));
	cmd.CommandID=PEER_OK;
	if(!PeerSendDataS(s,(char*)&cmd,sizeof(cmd),&retLen,hEvent,
					 SENDRECV_TIMEOUT))
	{
		return false;
	}
	RegCloseKey(hSetKey);

	return true;
}

////////删除键的某项///////////
bool PeerRegeditDelValue(SOCKET s,WSAEVENT hEvent)
{
	DWORD retLen;
	REGEDIT regKey;
	HKEY hRootKey,hDelKey;

	///////////得到要创建的键名////////////////
	if(!PeerRecvDataS(s,(char*)&regKey,sizeof(regKey),&retLen,
					 hEvent,SENDRECV_TIMEOUT))
	{
		return false;
	}

	//////////转换主键名到主键句柄/////////////
	if(!(hRootKey=GetPeerRegKey(regKey.key)))
	{
		return false;
	}

	
	if(RegOpenKey(hRootKey,regKey.sunkey,&hDelKey)!=ERROR_SUCCESS)
		return false;
	else
	{
		DWORD datalen=512;
		if(RegDeleteValue(hDelKey,regKey.value)!=ERROR_SUCCESS)
			return false;
	}
	/////////发回确认信息/////////////////
	COMMAND cmd;
	memset(&cmd,0,sizeof(cmd));
	cmd.CommandID=PEER_OK;
	if(!PeerSendDataS(s,(char*)&cmd,sizeof(cmd),&retLen,hEvent,
					 SENDRECV_TIMEOUT))
	{
		return false;
	}
	RegCloseKey(hDelKey);
	return true;
}